সি++ এ ফিউচারস (Futures), প্রমিসেস (Promises) এবং অ্যাসিনক্রোনাস প্রোগ্রামিং একসঙ্গে ব্যবহার করে মাল্টি-থ্রেডিং এবং অ্যাসিনক্রোনাস কার্য সম্পাদন করা যায়। C++11 এ এদের পরিচয় করানো হয়েছিল std::async, std::future, এবং std::promise এর মাধ্যমে, যা সময় নির্ধারণ ও প্রসেসিংয়ে কার্যকারিতা এবং কর্মদক্ষতা বৃদ্ধি করে। এগুলো বিশেষ করে CPU-ইনটেনসিভ টাস্কে একাধিক থ্রেডের মাধ্যমে কার্য সম্পাদন এবং বিভিন্ন সময়ে সম্পন্ন হতে পারে এমন কাজগুলো সম্পাদন করতে সহায়ক।
১. Futures (ফিউচারস)
std::future একটি ক্লাস টেমপ্লেট, যা অ্যাসিনক্রোনাস অপারেশনের মাধ্যমে একটি নির্দিষ্ট টাইপের মান ধরে রাখতে পারে। এটি অ্যাসিনক্রোনাস ফাংশন কলের আউটপুট ধরে রাখে এবং আউটপুট প্রস্তুত হওয়া পর্যন্ত অপেক্ষা করে। future মূলত টাস্ক সম্পন্ন হওয়ার পরবর্তী সময়ে মান পড়তে ব্যবহৃত হয়।
উদাহরণ:
#include <iostream>
#include <future>
int computeSquare(int x) {
return x * x;
}
int main() {
// অ্যাসিনক্রোনাস টাস্ক শুরু করা এবং ফিউচার পেতে async ব্যবহার
std::future<int> result = std::async(std::launch::async, computeSquare, 5);
// ফলাফল পাওয়ার জন্য অপেক্ষা করা এবং আউটপুট দেখানো
std::cout << "Square of 5: " << result.get() << std::endl;
return 0;
}এখানে, std::async ব্যবহার করে computeSquare ফাংশনটি অ্যাসিনক্রোনাসভাবে কল করা হয়েছে, এবং std::future এর মাধ্যমে এর ফলাফল সংগ্রহ করা হয়েছে। result.get() কলটি সেই ফলাফলটি রিটার্ন করে যা টাস্ক সম্পূর্ণ হওয়ার পরে পাওয়া যায়।
২. Promises (প্রমিসেস)
std::promise একটি অবজেক্ট যা অ্যাসিনক্রোনাস অপারেশনের ফলাফল সেট করতে ব্যবহৃত হয়। এটি মূলত std::future এর সঙ্গে কাজ করে। promise একটি মান ধরে রাখে এবং সেই মানকে future এর মাধ্যমে অ্যাসিনক্রোনাস থ্রেডে পৌঁছে দেয়।
উদাহরণ:
#include <iostream>
#include <future>
#include <thread>
void computeSquare(std::promise<int> prom, int x) {
prom.set_value(x * x); // প্রমিস সেট করা
}
int main() {
std::promise<int> prom;
std::future<int> result = prom.get_future(); // প্রমিস থেকে ফিউচার পাওয়া
std::thread t(computeSquare, std::move(prom), 6); // থ্রেড শুরু করা
std::cout << "Square of 6: " << result.get() << std::endl; // ফলাফল দেখানো
t.join();
return 0;
}উপরের উদাহরণে, std::promise computeSquare ফাংশনে প্রেরণ করা হয়েছে, এবং সেই প্রমিসে মান সেট করা হয়েছে যা মূল থ্রেডে future এর মাধ্যমে পাওয়া গেছে।
৩. Asynchronous Programming (অ্যাসিনক্রোনাস প্রোগ্রামিং)
অ্যাসিনক্রোনাস প্রোগ্রামিং এমন একটি পদ্ধতি যেখানে একাধিক কাজ একে অপরের অপেক্ষা না করেই সম্পন্ন হতে পারে। C++ এ অ্যাসিনক্রোনাস প্রোগ্রামিং std::async, std::future, এবং std::promise এর মাধ্যমে করা যায়।
উদাহরণ:
#include <iostream>
#include <future>
#include <thread>
#include <chrono>
void performTask(std::promise<int> prom) {
std::this_thread::sleep_for(std::chrono::seconds(2)); // 2 সেকেন্ড বিলম্ব
prom.set_value(42); // প্রমিসে মান সেট করা
}
int main() {
std::promise<int> prom;
std::future<int> fut = prom.get_future();
// থ্রেডে অ্যাসিনক্রোনাস টাস্ক শুরু করা
std::thread t(performTask, std::move(prom));
std::cout << "Waiting for result..." << std::endl;
std::cout << "Result: " << fut.get() << std::endl; // প্রমিসের ফলাফল দেখা
t.join();
return 0;
}এখানে performTask ফাংশনটি একটি আলাদা থ্রেডে অ্যাসিনক্রোনাসভাবে কাজ করছে, যেখানে ২ সেকেন্ড বিলম্বের পরে প্রমিস সেট করা হচ্ছে। future.get() কলটি সেই ফলাফলের জন্য অপেক্ষা করে যা টাস্কের শেষের দিকে প্রস্তুত হবে।
Futures এবং Promises এর সুবিধা
১. সহজ মাল্টি-থ্রেডিং: future এবং promise ব্যবহার করে থ্রেডের মধ্যে ডেটা আদান-প্রদান সহজ হয়।
২. সিঙ্ক্রোনাইজেশন: future এবং promise একসঙ্গে কাজ করে সিঙ্ক্রোনাইজড ডেটা ট্রান্সমিশন তৈরি করে। future.get() কল করা হলে, এটি অ্যাসিনক্রোনাসভাবে কাজ সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করে।
৩. Error Handling: promise ব্যবহার করে অ্যাসিনক্রোনাস প্রোগ্রামিংয়ে ত্রুটি নির্ণয় সহজ হয়।
সংক্ষেপে
- Futures: অ্যাসিনক্রোনাস ফাংশনের আউটপুট ধরে রাখে এবং কাজ সম্পন্ন হওয়ার পর তা রিটার্ন করে।
- Promises: অ্যাসিনক্রোনাস অপারেশনে মান সেট করার জন্য ব্যবহৃত হয়, যা
futureএ পৌঁছায়। - Asynchronous Programming:
std::async,std::future, এবংstd::promiseব্যবহার করে অ্যাসিনক্রোনাস কার্য সম্পাদন করা হয়, যা একাধিক কাজ একসঙ্গে সম্পন্ন করতে সহায়ক।
Futures, Promises, এবং Asynchronous Programming মাল্টি-থ্রেডিং প্রোগ্রামিংয়ে কার্যকারিতা এবং কর্মদক্ষতা বাড়ায়, যা আধুনিক প্রোগ্রামিংয়ের জন্য অত্যন্ত উপযোগী।
Read more